package parser;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class parserWord {
	public static ArrayList<Word> analysis(String script) {//解析任意脚本
		String[] line=script.split("\n");//分割每个行
		ArrayList<Word> word=new ArrayList<Word>();//全部单词
		String text="";//有效字符
		int mode=cfg.MODE_COMMON;//初始化
		boolean fInt=false;//是否为负数模式(懒得再写一个模式了)
		boolean wrong2=false;
		boolean jump=false;
		int jump_num=0;
		for(int i=0;i<line.length;i++) {
			String[] temp=line[i].split("");//逐字解析
			for(int a=0;a<temp.length;a++) {
				String text1=temp[a];//现行文字
				boolean wrong1 = false;
				if(jump) {
					jump_num--;
					if(jump_num==0) {
						jump=false;
					}
					continue;
				}
				if(mode==cfg.MODE_ZS) {
					if(text1.equals("*") && temp.length>a+1 && temp[a+1].equals("/")) {
						jump=true;
						jump_num=1;
						mode=cfg.MODE_COMMON;
						continue;
					}
					continue;
				}
				if(fInt) {
					if(text1.equals(" ")) {
						continue;
					}
					if(!wrong2&&text1.equals(".")) {
						wrong2=true;
						text=text+".";
						continue;
					}
					if(Tools.math.isNum(text1)) {
						text=text+text1;
						continue;
					}else {
						word.add(new Word(text,cfg.WORD_NUM,i+1));
						text="";
						fInt=false;
						wrong2=false;
					}
				}
				if(text1.equals("\"") && mode==cfg.MODE_COMMON){//在普通模式，如果遇到"则代表进入文本模式，如果已经进入则代表进入正常模式，如果为转义模式则把本符号计入有效字符
					mode=cfg.MODE_TEXT;//进入文本模式
					text=text+text1;
					continue;
				}
				if(text1.equals("\"") && mode==cfg.MODE_TEXT){//在文本模式
					mode=cfg.MODE_COMMON;//进入普通模式
					text=text+text1;
					word.add(new Word(text,i+1));//添加单词
					text="";//清空
					continue;
				}
				if(text1.equals("\"") && mode==cfg.MODE_ESCAPE){//在转义模式
					mode=cfg.MODE_TEXT;//进入文本模式
					text=text+text1;
					continue;
				}
				
				//如果遇到//则直接跳过本行，不在文本模式
				//判断到/时有三种情况，在文本模式则计入有效字符，文本数组下标大于当前下标并下一个字符也是/则跳出本行，其他的归为除号，将本符号当做单词
				if(text1.equals("/") && mode==cfg.MODE_TEXT){//在文本模式
					text=text+text1;
					continue;
				}
				if(text1.equals("/") && temp.length>=a && temp[a+1].equals("/")){//文本数组下标大于当前下标并下一个字符也是/
					break;  //直接结束for循环
				}
				if(text1.equals("/") && temp.length>=a && temp[a+1].equals("*")){// /*组合，直接跳过本行进多行注释模式
					mode=cfg.MODE_ZS;
					continue;  //直接结束for循环
				}
				if(text1.equals("/") && temp.length>=a && !temp[a+1].equals("/")){//文本数组下标大于当前下标并下一个字符不是/
					word.add(new Word(text,i+1));
					word.add(new Word(text1,cfg.WORD_U,i+1));
					text="";
					continue;
				}
				
				
				//如果遇到\且在文本模式，则进入转义模式，不把本字计入有效文本
				//如果已经进入转义模式则将本字符计入有效字符
				if(text1.equals("\\") && mode==cfg.MODE_TEXT){//在文本模式
					//进入转义模式
					mode=cfg.MODE_ESCAPE;
					continue;
				}
				if(text1.equals("\\") && mode==cfg.MODE_ESCAPE){//在转义模式
					text=text+text1;//将\加入有效字符
					mode=cfg.MODE_TEXT;
					continue;
				}
				if(text1.equals("r") && mode==cfg.MODE_ESCAPE){//在转义模式
					text=text+"\r";
					mode=cfg.MODE_TEXT;
					continue;
				}
				if(text1.equals("n") && mode==cfg.MODE_ESCAPE){//在转义模式
					text=text+"\n";
					mode=cfg.MODE_TEXT;
					continue;
				}
				if(text1.equals("t") && mode==cfg.MODE_ESCAPE){//在转义模式
					text=text+"\t";
					mode=cfg.MODE_TEXT;
					continue;
				}
				if(mode==cfg.MODE_ESCAPE) {
					text=text+"\\"+text1;
					mode=cfg.MODE_TEXT;
					continue;
				}
				if(mode!=cfg.MODE_TEXT) {
					if(text1.equals("&")&&temp.length>a+1&&temp[a+1].equals("&")) {
						if(!text.equals("")) {
							word.add(new Word(text,i+1));
							text="";
						}
						jump=true;
						jump_num=1;
						word.add(new Word("&&",cfg.WORD_U,i+1));
						continue;
					}
					if(text1.equals("|")&&temp.length>a+1&&temp[a+1].equals("|")) {
						if(!text.equals("")) {
							word.add(new Word(text,i+1));
							text="";
						}
						jump=true;
						jump_num=1;
						word.add(new Word("||",cfg.WORD_U,i+1));
						continue;
					}
					if(text1.equals("=")&&temp.length>a+1&&temp[a+1].equals("=")) {
						if(!text.equals("")) {
							word.add(new Word(text,i+1));
							text="";
						}
						jump=true;
						jump_num=1;
						word.add(new Word("==",cfg.WORD_U,i+1));
						continue;
					}
					for(int d=0;d<cfg.u.length;d++) {
						if(cfg.u[d].equals(text1)) {
							if(text1.equals("-")&&temp.length>=a&&(a==0||word.get(word.size()-1).text.equals("("))&&Tools.math.isNum(temp[a+1])) {
								if(!text.equals("")) {
									word.add(new Word(text,i+1));
									word.add(new Word(text1,cfg.WORD_U,i+1));
									text="";
									wrong1=true;
									break;
								}
								//是一个负数
								fInt=true;
								if(!text.equals("")) {
									word.add(new Word(text,i+1));
								}
								text="-";
								wrong1=true;
								break;
							}
							
							if(!text.equals("")) {
								word.add(new Word(text,i+1));
							}
							word.add(new Word(text1,cfg.WORD_U,i+1));
							text="";
							wrong1=true;
							break;
						}
					}
					if (wrong1)
                    {
                        continue;
                    }
				}
				
				if(text1.equals("&") && mode!=cfg.MODE_TEXT && temp.length>a+1 && !temp[a+1].equals("&")) {//引用类型
					word.add(new Word(text,i+1));
					word.add(new Word(text1,cfg.WORD_U,i+1));
					text="";
					continue;
				}
				
				//如果为.则判断有效字符是否不为数字开头，否则把前面的做单词，本符号也做单词，不在文本模式
				//如果为.且为数字开头且都是数字（不含.），本符号做有效字符
				if(text1.equals(".") && mode!=cfg.MODE_TEXT && Tools.math.isNum(text)!=true) {//引用了类
					word.add(new Word(text,i+1));
					word.add(new Word(text1,cfg.WORD_U,i+1));
					text="";
					continue;
				}
				if(text1.equals(".") && mode!=cfg.MODE_TEXT && Tools.math.isNum(text)==true) {//浮点整数
					text=text+text1;
					continue;
				}
				
				
				//如果为空格，且不在文本模式，且有效字符为关键字，则把有效字符做单词，忽略本字符
				if(text1.equals(" ") && mode!=cfg.MODE_TEXT && Tools.greyLang.isImportantWord(text)) {
					word.add(new Word(text,cfg.WORD_IMP,i+1));
					text="";
					continue;
				}
				//如果为空格，且不在文本模式，且有效字符不为关键字，则忽略本字符
				if(text1.equals(" ") && mode!=cfg.MODE_TEXT && !Tools.greyLang.isImportantWord(text)) {
					continue;
				}
				
				//如果为空格，且在文本模式，则把有效字符做单词，忽略本字符
				text=text+text1;//没什么就当做有效字符
			}
			/*
			if(!word.get(word.size()-1).text.equals(";")) {
				if(!text.equals("")) {
					word.add(new Word(text,i+1));
				}
				word.add(new Word(";",cfg.WORD_U,i+1));
			}
			*/
		}
		
		ArrayList<Word> word1=new ArrayList<Word>();
		for(int j=0;j<word.size();j++) {
			if(!word.get(j).text.equals("")) {
				word1.add(word.get(j));
			}
		}
		return word1;
	} 
	
}
